/**
 * api调用服务
 */

import type { PlasmoMessaging } from "@plasmohq/messaging"
import { Storage } from "@plasmohq/storage"

import ApiList from "~utils/apis"

const storage = new Storage()

// 基于PlasmoMessaging.Request<TName,TBody>, TName为消息名称类型，TBody为消息体类型
// 定义req的类型
type ApiServiceReq = PlasmoMessaging.Request<
  string,
  {
    // api为请求的接口名称
    api: string
    // data为请求的数据
    data?: any
  }
>

const handler: PlasmoMessaging.MessageHandler = async (
  req: ApiServiceReq,
  res
) => {
  // 解构请求体
  const { api, data } = req.body
  // 根据api字符串作为方法名称，动态调用apiList对应的方法
  try {
    const res_data = await ApiList[api](data)
    // 判断是否凭证已过期
    // 1.本测试接口code返回403
    // 2.正式接口返回200，但是data.error:"Signature has expired."
    const _error = res_data?.data?.error || ''
    if (
      res_data.code == 403 ||
      _error === "Signature has expired."
    ) {
      // 登录失效处理
      await storage.set("loginInfo", {})
      await storage.set("isLogin", false)
      await storage.set("loginErr", "")
      res.send({ err: "登录失效，请重新登录", data: {} })
    } else {
      // 返回400错误
      if (res_data.code === 400) {
        res.send({ err: res_data?.msg || "请求参数错误", data: {} })
      } else {
        res.send({ err: "", data: res_data?.data || res_data })
      }
    }
  } catch (e) {
    console.log(`网络请求服务错误[${api}]`, e)
    res.send({
      err: `dg-assistant网络请求服务错误: [${api}]-${e.toString()}`,
      data: {}
    })
  }
}

export default handler
